#include "stringutils.h"

#include <QChar>
#include <QString>
#include <QByteArray>
#include <QTextCodec>

#include <QDebug>

namespace qrcode{

bool StringUtils::ON = true;

StringUtils::StringUtils()
{

}

bool StringUtils::ContainChinese(std::string str)
{
    QString qStr = QString::fromStdString(str);
    int count = qStr.count();
    for(int i=0; i < count; i++)
    {
        QChar ch = qStr.at(i);
        ushort uni = ch.unicode();
        if(uni >= 0x4E00 && uni <= 0x9FA5)
        {
            return true;
        }
    }
    return false;
}

bool StringUtils::IsPureNumber(std::string str)
{
    QString qStr = QString::fromStdString(str);
    QByteArray byteArray = qStr.toLatin1();  //QString转换为char*
    const char *s = byteArray.data();

    while(*s && *s >= '0' && *s <= '9')
    {
        s++;
    }

    if(*s)
    {
        //不是数字
        return false;
    }
    else
    {
        //是数字
        return true;
    }
}

bool StringUtils::IsAlphaNumber(std::string str)
{
    QString qStr = QString::fromStdString(str);
    QByteArray byteArray = qStr.toLatin1();  //QString转换为char*
    const char *s = byteArray.data();

    while(*s && ((*s >= '0' && *s <= '9') || (*s >= 'A' && *s <= 'Z')
          || (*s == 0x0020) || (*s == 0x0024) || (*s == 0x0025) || (*s == 0x002A) || (*s == 0x003A)
          || (*s == 0x002B) || (*s == 0x002D) || (*s == 0x002E) || (*s == 0x002F)))
    {
        s++;
    }

    if(*s)
    {
        //不是字母数字
        return false;
    }
    else
    {
        //是字母数字
        return true;
    }
}

bool StringUtils::IsByte(std::string str)
{
    QString qStr = QString::fromStdString(str);
    QByteArray byteArray = qStr.toLatin1();  //QString转换为char*
    const char *s = byteArray.data();

    while(*s && ((*s >= 0x0020 && *s <= 0x007E) || (*s >= 0x00A0 && *s <= 0x00FF)))
    {
        s++;
    }

    if(*s)
    {
        //不是ISO/IEC 8859-1编码字符
        return false;
    }
    else
    {
        //是ISO/IEC 8859-1编码字符
        return true;
    }
}

void StringUtils::Utf8ToGB2312(std::__cxx11::string &str)
{
    QTextCodec *utf8Codec = QTextCodec::codecForName("utf-8");
    QTextCodec *gb2312Codec = QTextCodec::codecForName("gb2312");

    QString strUnicode = utf8Codec->toUnicode(str.data());
    QByteArray byteGB2312 = gb2312Codec->fromUnicode(strUnicode);
    str = byteGB2312.data();
}

void StringUtils::Utf8ToShift_JIS(std::__cxx11::string &str)
{
    QTextCodec *utf8Codec = QTextCodec::codecForName("utf-8");
    QTextCodec *ShiftJISCodec = QTextCodec::codecForName("Shift-JIS");

    QString strUnicode = utf8Codec->toUnicode(str.data());
    QByteArray byteShiftJIS = ShiftJISCodec->fromUnicode(strUnicode);
    str = byteShiftJIS.data();
}

int StringUtils::ToInt(char ch)
{
    if(ch == '1'){
        return 1;
    } else if(ch == '0'){
        return 0;
    }
}

QString StringUtils::ToString(std::vector<int> &vec)
{
    QString str = "";
    for(int i = 0; i < vec.size(); i++){
        str += QString("%1").arg(vec.at(i));
        str += " ";
    }
    return str;
}

QString StringUtils::ToString(std::vector<char> &vec)
{
    QString str = "";
    for(int i = 0; i < vec.size(); i++){
        str += QString("%1").arg(vec.at(i));
        str += " ";
    }
    return str;
}

void StringUtils::PRINT(int x)
{
    if(ON){
        qDebug() << x;
    }
}

void StringUtils::PRINT(QString str)
{
    if(ON){
        qDebug() << str;
    }
}

void StringUtils::PRINT(QString str, int x)
{
    if(ON){
        qDebug() << str + QString("%1").arg(x);
    }
}

void StringUtils::PRINT(QString str, int x, int y)
{
    if(ON){
        qDebug() << str + QString("%1, %2").arg(x).arg(y);
    }
}

void StringUtils::PRINT(QString str, char c)
{
    if(ON){
        qDebug() << str + QString("%1").arg(c);
    }
}

void StringUtils::PRINT(QString str, std::vector<int> vec)
{
    if(ON){
        qDebug() << str + ToString(vec);
    }
}

void StringUtils::PRINT(QString str, std::vector<char> vec)
{
    if(ON){
        qDebug() << str + ToString(vec);
    }
}

void StringUtils::PRINT(std::vector<int> vec)
{
    if(ON){
        qDebug() << ToString(vec);
    }
}

void StringUtils::PRINT(std::vector<char> vec)
{
    if(ON){
        qDebug() << ToString(vec);
    }
}

void StringUtils::PRINT(std::vector<std::vector<char> > vec)
{
    if(ON){
        for(int i = 0; i < vec.size(); i++){
            qDebug() << ToString(vec.at(i));
        }
    }
}

void StringUtils::PRINT(std::vector<std::vector<int> > vec)
{
    if(ON){
        for(int i = 0; i < vec.size(); i++){
            qDebug() << ToString(vec.at(i));
        }
    }
}

void StringUtils::PRINT(QString str, std::vector<std::vector<char> > vec)
{
    if(ON){
        qDebug() << str;
        PRINT(vec);
    }
}

void StringUtils::PRINT(QString str, std::vector<std::vector<int> > vec)
{
    if(ON){
        qDebug() << str;
        PRINT(vec);
    }
}

}
